package cn.huiyunche.base.service.interfaces;

import cn.huiyunche.base.service.form.BFeeProductForm;
import cn.huiyunche.base.service.model.BProductArrivalConfig;
import cn.huiyunche.base.service.model.BProductCoefficient;
import cn.huiyunche.base.service.vo.BProductCoefficientVo;
import cn.huiyunche.base.service.vo.BProductVo;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface BProductsService {

    /**
     * @param depaId 提车地址id
     * @param destId 交车地址id
     * @param atime  提车日期
     * @param adate  提车时间 0：上午0~12点， 1：13~24点
     * @Title: fetchProducts
     * @Description: 根据地址信息获取物流产品
     * @return: List<BProductVo>
     */
    List<BProductVo> fetchProducts(long depaId, long destId, Date adate, int atime) throws Exception;

    /**
     * @param feeProductForm
     * @return List<BProductVo>
     * @Description: 根据地址时间查询物流产品
     */
    List<BProductVo> fetchProducts(BFeeProductForm feeProductForm) throws Exception;

    /**
     * @param id
     * @param distance
     * @Title: getProduct
     * @Description: 根据产品id获取产品信息
     * @return: BProductVo
     */
    BProductVo getProduct(long id, BigDecimal distance);

    /**
     * @param productid 物流产品id
     * @param distance  运距
     * @Title: getProductCoefficientByConditions
     * @Description: 查询物流产品价格系数
     * @return: BProductCoefficient
     */
    BProductCoefficient getProductCoefficientByConditions(long productid, BigDecimal distance);

    /**
     * @param distance    运距
     * @param isExpedited 是否加急
     * @param startTime   出发时间
     * @param AMorPM      上午或下午（0，1）
     * @Title: getCoefficients
     * @Description: 根据运距查询物流产品
     * @return: List<BProductCoefficientVo>
     */
    List<BProductCoefficientVo> getCoefficients(BigDecimal distance, Boolean isExpedited, Date startTime, Integer AMorPM);

    /**
     * @param productId 物流产品id
     * @param endRange  运距结束范围
     * @Title: getArriveDays
     * @Description: 查询物流产品的预计到达时间
     * @return: BProductArrivalConfig
     */
    BProductArrivalConfig getArriveDays(Long productId, BigDecimal endRange);

    /**
     * @param id 主键
     * @Title: getById
     * @Description: 根据id返回物流产品系数
     * @return: BProductCoefficient
     */
    BProductCoefficient getById(Long id);

    /**
     * @param startTime 出发时间
     * @param days      物流产品的设置最小天数
     * @param maxDays   物流产品的设置最大天数
     * @param endTime   结束时间（23:59:59）
     * @param AMorPM    上午或下午（0，1）
     * @Title: computeEstimatedArrivalTime
     * @Description: 计算到达时间
     * @return: Date
     */
    Date computeEstimatedArrivalTime(Date startTime, Integer days, Integer maxDays, Date endTime, Integer AMorPM);

    /**
     * @param arriveDay 参数 物流产品对应到达时间配置信息
     * @param distance  距离
     * @Title: computeDays
     * @Description: 计算总耗费天数
     * @return: Integer 天数
     */
    Integer computeDays(BProductArrivalConfig arriveDay, BigDecimal distance);

    /**
     * @param bArriveDaysId 物流产品的到达时间配置
     * @Title: getBProductArrivalConfigById
     * @Description:
     * @return: BProductArrivalConfig
     */
    BProductArrivalConfig getBProductArrivalConfigById(Long bArriveDaysId);
}
